﻿//this souce file is create for the standard cpp class pattern
//author: Ian Nanay (alexandercer@gmail.com)
//date: 
//

class object
{
};

class info
{
};

class rect : public object, public info ///@alex:todo:确定多重继承
{
	private:
		int x,y,w,h;
	private:
		bool flag;
	public:
		char* objectname, * objectalias;
	protected:
		char* baseclassname;

	public:
		rect();///@alex: default ctor,包括无参数构造函数以及参数均有默认值的构造函数
		virtual ~rect();///@alex: 析构函数容易被忘记///@alex:也不要忘了加上virtual，来标记虚析构函数
		rect(const rect & _copy);

		///@alex: 为什么要在operator=中返回"*this"的引用: 主要是为了防止返回pass-by-value的时候，会生成临时变量的问题，我们通过直接返回引用，可以避免由此导致的效率问题.(http://tech.ddvip.com/2007-03/117405415521455.html)
		rect & operator= (const rect & _assign);///@alex: 参考ecpp#10,ecpp#11，将赋值型的操作返回为引用
		rect & operator+= (const rect & rhs);///@alex:ecpp#10
		rect & operator-= (const rect & rhs);///@alex:ecpp#10
		rect & operator*= (const rect & rhs);
		rect & operator/= (const rect & rhs);
		
		bool operator==(const rect & rhs);
		bool operator!=(const rect & rhs);
		bool operator<=(const rect & rhs);
		bool operator>=(const rect & rhs);
		bool operator<(const rect & rhs);
		bool operator>(const rect & rhs);

		///@alex:todo:ostream & operator<<(....)

		int & operator[](unsigned int index);
		int & operator()(unsigned int index);

		const int & operator[](unsigned int index) const;///@alex:注意这边同样要写一个const成员函数来匹配非const成员函数
		const int & operator()(unsigned int index) const;

		///@alex:const对于函数的修饰仅仅只能作用在成员函数上，如果是非成员函数是不能加上const来修饰整个函数的，即不能再函数体和函数声明之间加上const
		
		rect & operator++();///@alex: pre-fix plus plus; rect i; ++i; 
		const rect operator++(int);///@alex: post-fix plus plus; rect i; i++;

		bool isflagset(void);
};///@alex:最后的分号也容易被忘记

const rect operator+ (const rect & lhs, const rect &rhs);///@alex:ecpp#21,ecpp#20
const rect operator- (const rect & lhs, const rect &rhs); 
const rect operator* (const rect & lhs, const rect &rhs); 
const rect operator/ (const rect & lhs, const rect &rhs); 

/*
    　　增1减1运算符是单目运算符。它们又有前缀和后缀运算两种。为了区分这两种运算，将后缀运算视为又目运算符。表达式

    　　obj++或obj--

    　　被看作为：

    　　obj++0或obj--0
*/


